[broadway] Add stacktrace debugging functions
authorAlexander Larsson <alexl@redhat.com>
Tue, 12 Apr 2011 08:13:38 +0000 (10:13 +0200)
committerAlexander Larsson <alexl@redhat.com>
Tue, 12 Apr 2011 09:12:39 +0000 (11:12 +0200)
gdk/broadway/broadway.js

index 1386cb03a13cc7fd790eb68eecde03812f2528fa..150f46c9e16ad298ad789075fd0c3543880b47c4 100644 (file)
@@ -11,6 +11,62 @@ function log(str) {
     logDiv.appendChild(document.createElement('br'));
 }
 
+function getStackTrace()
+{
+    var callstack = [];
+    var isCallstackPopulated = false;
+    try {
+       i.dont.exist+=0;
+    } catch(e) {
+       if (e.stack) { // Firefox
+           var lines = e.stack.split("\n");
+           for (var i=0, len=lines.length; i<len; i++) {
+               if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
+                   callstack.push(lines[i]);
+               }
+           }
+           // Remove call to getStackTrace()
+           callstack.shift();
+           isCallstackPopulated = true;
+       } else if (window.opera && e.message) { // Opera
+           var lines = e.message.split("\n");
+           for (var i=0, len=lines.length; i<len; i++) {
+               if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
+                   var entry = lines[i];
+                   // Append next line also since it has the file info
+                   if (lines[i+1]) {
+                       entry += " at " + lines[i+1];
+                       i++;
+                   }
+                   callstack.push(entry);
+               }
+           }
+           // Remove call to getStackTrace()
+           callstack.shift();
+           isCallstackPopulated = true;
+       }
+    }
+    if (!isCallstackPopulated) { //IE and Safari
+       var currentFunction = arguments.callee.caller;
+       while (currentFunction) {
+           var fn = currentFunction.toString();
+           var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
+           callstack.push(fname);
+           currentFunction = currentFunction.caller;
+       }
+    }
+    return callstack;
+}
+
+function logStackTrace(len) {
+    var callstack = getStackTrace();
+    var end = callstack.length;
+    if (len > 0)
+       end = Math.min(len + 1, end);
+    for (var i = 1; i < end; i++)
+       log(callstack[i]);
+}
+
 var base64Values = [
     255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
     255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,